package ar.com.tallerdos.smartdinner.gson.serializer;

import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import android.annotation.SuppressLint;
import android.util.Log;
import ar.com.tallerdos.smartdinner.model.Agregado;
import ar.com.tallerdos.smartdinner.model.Pedido;
import ar.com.tallerdos.smartdinner.model.Producto;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.reflect.TypeToken;

public class PedidoCustomSerializer implements JsonDeserializer<Pedido> {

    @SuppressWarnings("unchecked")
    @SuppressLint("SimpleDateFormat")
    @Override
    public Pedido deserialize(JsonElement json, Type arg1,
	    JsonDeserializationContext context) throws JsonParseException {
	
	JsonObject jo = (JsonObject) json;
	
	Pedido pedido = new Pedido();
	pedido.setCodigo(jo.get("id").getAsInt());
	pedido.setCantidad(jo.get("cantidad").getAsInt());
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	try {
	    pedido.setFechaAlta(sdf.parse(jo.get("encargado").getAsString()));
	    Producto producto = new Producto();
	    producto.setId(jo.get("producto_id").getAsInt());
	    pedido.setProducto(producto);
	    
	    Date fechaMod;
	    
	    if (!JsonNull.INSTANCE.equals(jo.get("cancelado"))) {
		fechaMod = sdf.parse(jo.get("cancelado").getAsString());
		
	    } else if (!JsonNull.INSTANCE.equals(jo.get("entregado"))) {
		fechaMod = sdf.parse(jo.get("entregado").getAsString());
		
	    } else if (!JsonNull.INSTANCE.equals(jo.get("terminado"))) {
		fechaMod = sdf.parse(jo.get("terminado").getAsString());
		
	    } else if (!JsonNull.INSTANCE.equals(jo.get("comenzado"))) {
		fechaMod = sdf.parse(jo.get("comenzado").getAsString());
		
	    } else if (!JsonNull.INSTANCE.equals(jo.get("encargado"))) {
		fechaMod = sdf.parse(jo.get("encargado").getAsString());
		
	    } else {
		// Esto no deberia ocurrir nunca
		fechaMod = null;
	    }
	    pedido.setEstado(jo.get("estado").getAsString());
	    pedido.setFechaMod(fechaMod);
	} catch (ParseException e) {
	    e.printStackTrace();
	    Log.e(this.getClass().getCanonicalName(), "Error al parsear la hora del pedido");
	}
	
	if (!JsonNull.INSTANCE.equals(jo.get("agregados"))) {
	    pedido.setAgregados((List<Agregado>) context.deserialize(jo.get("agregados"), new TypeToken<List<Agregado>>() { }.getType()));
//	    String agregadoIds = jo.get("agregado_id").getAsString();
//	    comida.setPedidos();
//	    for (String idStr : agregadoIds.split(",")) {
//		pedido.getAgregados().add(AgregadoBusiness.findById(Integer.valueOf(idStr)));
//	    }
	}
	
	return pedido;
    }

}
